#include <bits/stdc++.h>
using namespace std;

template <typename Iterator>
void RandomShuffle(Iterator start, Iterator end)
{
    if (start == end)
        return;
    for (auto i = start + 1; i != end; i++)
    {
        auto j = start + std::rand() % (i - start + 1);
        if (i != j)
            swap(*i, *j);
    }
}

int main()
{
    vector<int> v = {1, 2, 3, 4, 5, 6};

    // reverse:逆序
    // reverse(v.begin(), v.end());
    // for_each(v.begin(), v.end(), [](int &a)
    //          { cout << a << " "; });
    // cout << endl;

    // rotate:  旋转元素次序
    // rotate(v.begin(), v.begin() + 2, v.end());
    // for_each(v.begin(), v.end(), [](int &a)
    //          { cout << a << " "; });

    // 全排列 : 一个数列从小到大 从大到小的全部可能情况

    // next_permutation:得到元素的下一个排列次序
    // next_permutation(v.begin(), v.end());
    // for_each(v.begin(), v.end(), [](int &a)
    //          { cout << a << " "; });
    // cout<<endl;

    // prev_permutation:得到元素的上一个排列次序
    // prev_permutation(v.begin(), v.end());
    // for_each(v.begin(), v.end(), [](int &a)
    //          { cout << a << " "; });
    // cout << endl;

    // random_shuffle:将元素的次序随机打乱
    // srand(time(nullptr));
    // random_shuffle(v.begin(), v.end());
    // for_each(v.begin(), v.end(), [](int &a)
    //          { cout << a << " "; });
    // cout << endl;

    // partition:分组算法  不稳定
    // partition(v.begin(), v.end(), [](int &a)
    //           { return a % 2 == 0; });
    // for_each(v.begin(), v.end(), [](int &a)
    //          { cout << a << " "; });
    // cout << endl;

    // stable_partition:稳定的分组算法
    stable_partition(v.begin(), v.end(), [](int &a)
                     { return a % 2 == 0; });
    for_each(v.begin(), v.end(), [](int &a)
             { cout << a << " "; });
    cout << endl;
    return 0;
}